package cn.iocoder.yudao.module.erp.service.gi;

import cn.iocoder.yudao.module.erp.controller.admin.dp.dpgz.vo.DpGzSaveReqVO;
import cn.iocoder.yudao.module.erp.controller.admin.gi.gigz.vo.GiGzPageReqVO;
import cn.iocoder.yudao.module.erp.controller.admin.gi.gigz.vo.GiGzSaveReqVO;
import cn.iocoder.yudao.module.erp.dal.dataobject.dpitem.DpItemGzDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.giitem.GiItemGzDO;
import cn.iocoder.yudao.module.erp.dal.mysql.gi.GiGzMapper;
import cn.iocoder.yudao.module.erp.dal.mysql.giitem.GiItemGzMapper;
import cn.iocoder.yudao.module.erp.service.dp.DpGzServiceImpl;
import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
import cn.iocoder.yudao.module.system.service.user.AdminUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;
import cn.iocoder.yudao.module.erp.dal.dataobject.gi.GiGzDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.List;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.GI_INCOUNT_NOT_ZERO;

/**
 * ERP物流广州仓库 Service 实现类
 * @author 天使管理员
 */
@Service
@Validated
public class GiGzServiceImpl implements GiGzService {

    @Resource
    private GiGzMapper giGzMapper;
    @Resource
    private GiItemGzMapper giItemGzMapper;
    @Resource
    private AdminUserService userService;
    @Autowired
    private DpGzServiceImpl dpGzServiceImpl;

    @Override
    @Transactional(rollbackFor = Exception.class)
    public String createGiGz(GiGzSaveReqVO createReqVO) {
        Integer inCount = createReqVO.getInCount();
        if (inCount == null || inCount == 0) {
            throw exception(GI_INCOUNT_NOT_ZERO);
        }
        String maxId = generateOrderNumber();
        createReqVO.setId(maxId);
        // 插入
        GiGzDO giGz = BeanUtils.toBean(createReqVO, GiGzDO.class);
        giGzMapper.insert(giGz);
        // 插入子表
        createGiItemGzList(maxId, createReqVO.getGiItemGzs());
        // 返回
        return maxId;
    }

    public String generateOrderNumber() {
        // 获取当前日期
        LocalDate currentDate = LocalDate.now();
        // 格式化为 yyyyMMdd
        String dateStr = currentDate.format(DateTimeFormatter.ofPattern("yyyyMMdd"));
        // 获取当前最大单号的前8位和最后四位
        String currentMaxOrderStr = getCurrentMaxOrderNumber();
        if ("0001".equals(currentMaxOrderStr)){
            return "GZ" + dateStr + currentMaxOrderStr;
        }
        // 获取当前最大单号的日期部分
        String currentMaxDateStr = currentMaxOrderStr.substring(2, 10);
        // 如果日期不一致，重置序列为0001
        int sequence;
        if (currentMaxDateStr.equals(dateStr)) {
            // 日期一致，则增加序列
            sequence = Integer.parseInt(currentMaxOrderStr.substring(10)) + 1;
        } else {
            // 日期不一致，则重置序列为 0001
            sequence = 1;
        }
        // 生成新的单号
        return "GZ" + dateStr + String.format("%04d", sequence);
    }

    // 从数据库中获取当前最大单号
    private String getCurrentMaxOrderNumber() {
        // 此处应从数据库查询获取当前最大单号
        return giGzMapper.getCurrentMaxOrderNumber();
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateGiGz(GiGzSaveReqVO updateReqVO) {
        // 更新
        GiGzDO updateObj = BeanUtils.toBean(updateReqVO, GiGzDO.class);
        // 获得用户信息
        AdminUserDO user = userService.getUser(getLoginUserId());
        updateObj.setUpdater(user.getUsername());
        giGzMapper.updateById(updateObj);
        // 更新子表
        updateGiItemGzList(updateReqVO.getId(), updateReqVO.getGiItemGzs());
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void deleteGiGz(String id) {
        // 删除子表
        deleteGiItemGzByNo(id);
        // 删除
        giGzMapper.deleteById(id);
    }


    @Override
    public GiGzDO getGiGz(String id) {
        return giGzMapper.selectById(id);
    }

    @Override
    public PageResult<GiGzDO> getGiGzPage(GiGzPageReqVO pageReqVO) {
        return giGzMapper.selectPage(pageReqVO);
    }

    // ==================== 子表（ERP物流广州仓库货号详情） ====================

    @Override
    public List<GiItemGzDO> getGiItemGzListByNo(String no) {
        return giItemGzMapper.selectListByNo(no);
    }

    @Override
    public void examineGiGz(GiGzDO giGzDO) {
        // 将 GiGzSaveReqVO 转换为 DpGzSaveReqVO,处理并保存插入到 DpGzSaveReqVO 对应的表
        convertGiGzToDpGz(giGzDO);
        giGzMapper.updateById(giGzDO);
    }

    private void createGiItemGzList(String no, List<GiItemGzDO> list) {
        if (list == null || list.size() == 0){
            return;
        }
        list.forEach(o -> o.setNo(no));
        giItemGzMapper.insertBatch(list);
    }

    private void updateGiItemGzList(String no, List<GiItemGzDO> list) {
        if (list == null || list.size() == 0){
            return;
        }
        deleteGiItemGzByNo(no);
		list.forEach(o -> o.setNo(null)); // 解决更新情况下：1）id 冲突；2）updateTime 不更新
        createGiItemGzList(no, list);
    }

    private void deleteGiItemGzByNo(String no) {
        giItemGzMapper.deleteByNo(no);
    }

    // 将 GiGzSaveReqVO 转换为 DpGzSaveReqVO
    public void  convertGiGzToDpGz(GiGzDO giGzDO) {

        GiGzDO giGz = giGzMapper.selectById(giGzDO.getId());
        List<GiItemGzDO> giItemGzDOList = giItemGzMapper.selectListByNo(giGzDO.getId());
        // 复制 GiGzSaveReqVO 中的属性到 DpGzSaveReqVO
        DpGzSaveReqVO createReqVO = BeanUtils.toBean(giGz, DpGzSaveReqVO.class);
        //设置剩余总件数
        createReqVO.setRemCount(giGz.getInCount());
        //设置剩余总体积
        createReqVO.setRemVolume(giGz.getInVolume());
        //设置剩余总重量
        createReqVO.setRemWeight(giGz.getWeight());
        List<DpItemGzDO> dpItemGzs = BeanUtils.toBean(giItemGzDOList, DpItemGzDO.class);
        // 设置转换后的列表到 DpGzSaveReqVO
        createReqVO.setDpItemGzs(dpItemGzs);
        dpGzServiceImpl.createDpGz(createReqVO);
    }

}